#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

// 1.一维数组的创建和初始化
// 1.1 数组创建
//int main(){
//	// 数组:一组相同类型元素的集合
//	int arr[10];
//	char ch[5];
//	double data1[20];
//	double data2[15+5];
//	
//	int n = 10;
//	int arr2[n]; // 这种数组不能被初始化 
//	// 在c99标准之前,数组的大小必须是常量或者常量表达式,c99之后,数组的大小可以是变量,为了支持变长数组 
//} 


// 1.2 数组的初始化 
//int main(){
//	//不完全初始化.剩余的元素默认初始化为0 
//	int arr[10] = {1,2,3};  
//	int arr1[10] = {1,2,3,4,5,6,7,8,9,0};
//	int arr2[] = {1,2,3}; 
//	char ch1[10] = {'a','b','c'};
//	// a b c 0 0 0 0 0 0 0  
//	char ch2[10] = "abc";
//	// a b c \0 0 0 0 0 0 0 
//	char ch3[] = {'a','b','c'}; //3
//	char ch4[] = "abc" //4
//	
//} 


// 1.3 一维数组的使用 
//int main(){
//	int i = 0; 
//	int arr[] = {1,2,3,4,5,6,7,8,9,10};
//	int sz = sizeof(arr)/sizeof(arr[0]); 
	//[]-下标引用操作符 
//	printf("%d",arr[4]);

	//打印数组的每个元素的地址-一维数组在内存中是连续存放的,有规律的递增 
//	for(i=0;i<sz;i++){
//		printf("&arr[%d] = %d\n",i,&arr[i]); 
//	} 
	
//	for(i=0;i<sz;i++){
//		printf("%d ",arr[i]); 
//	}
//	printf("\n");
//	for(i=sz-1;i>=0;i--){
//		printf("%d ",arr[i]); 
//	}
//	return 0; 
//} 


// 2.二维数组的创建和初始化
// 2.1 二维数组的创建
// 2.2 二维数组的初始化 
//int main(){
	//1 2 3 4
	//2 3 4 5
	//4 5 6 7
	//先行后列 
//	int arr1[3][4] = {1,2,3,4,2,3,4,5,4,5,6,7};
//	int arr1[3][4] = {{1,2},{3,4},{2,3}};
//	int arr2[][4] = {{1,2,3,4},{2,3}} // 可以省略行,不能省略列 

//	char arr2[5][10]; 
	 
//	return 0; 
//} 

// 2.3 二维数组的使用 
//int main(){
//	int arr1[3][4] = {1,2,3,4,2,3,4,5,4,5,6,7};
//	int i = 0; 
//	 printf("%d\n",arr1[0][2]);
	
//	for(i=0;i<3;i++){
//		int j = 0; 
//		for(j=0;j<4;j++){
//			scanf("%d",&arr1[i][j]); 
//		} 
//	} 
	
	
//	for(i=0;i<3;i++){
//		int j = 0; 
//		for(j=0;j<4;j++){
//			printf("&arr[%d][%d]=%p\n",i,j,&arr1[i][j]);
//		}
//	} 
//	
//	return 0; 
//} 


// 3.数组越界
//int main(){
//	int arr[] = {1,2,3,4,5,6};
//	int i = 0;
//	int sz = sizeof(arr)/sizeof(arr[0]); 
//	for(i=0;i<sz;i++){
//		printf("%d ",arr[i]);
//	} 
//	
//	return 0; 
// } 

//int main(){
//	int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
//	int i = 0;
//	for(i=0;i<3;i++){
//		int j = 0;
//		for(j=0;j<=4;j++){
//			printf("%d ",arr[i][j]);
//		} 
//	} 
//} 


//4.数组作为函数传参
//void Swap(int *x,int *y){
//	int c = 0;
//	c = *x;
//	*x = *y;
//	*y = c;
//} 
//
//// 形参是指针的形式 
//void Bubble_sort(int *arr,int sz){
//	int i = 0;
//	int j = 0; 
//	int min = arr[0];
//	for(i=0;i<sz;i++){
//		for(j=0;j<sz;j++){
//			if(arr[i] < arr[j]){
//				Swap(&arr[i],&arr[j]);  
//			}
//		} 
//	}
//	for(i=0;i<sz;i++){
//		printf("%d ",arr[i]);
//	}
//	
//}
//
//int main(){
//	//将数据排成升序 
//	int arr[10] = {9,5,3,4,11,6,7,8,9,0};
//	int sz = sizeof(arr)/sizeof(arr[0]);
//	//冒泡排序
//	Bubble_sort(arr,sz);
//	
//	return 0; 
//} 


//4.2 数组名
//数组名确实能表示首元素的地址
//但是有两个例外
// 1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
// 2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址 
//int main(){
//	int arr[10];
//	printf("%p\n",arr); // 首元素地址 
//	printf("%p\n",arr+1);
//	printf("-----------------\n");
//	printf("%p\n",&arr[0]); // 首元素的地址 
//	printf("%p\n",&arr[0]+1);
//	printf("-----------------\n"); 
//	printf("%p\n",&arr);  // 数组的地址 
//	printf("%p\n",&arr+1);
	
//	int n = sizeof(arr);
//	printf("%d\n",n);
//	return 0; 
//} 

//二维数组的数组名的理解 
int main(){
	int arr[3][4];
	
	printf("%d\n",sizeof(arr)/sizeof(arr[0]));
	printf("%d\n",sizeof(arr[0])/sizeof(arr[0][0]));
	
	printf("%p\n",arr);  //二维数组的数组名也表示数组的地址
	printf("%p\n",arr+1);
	
	return 0; 
}






